Eine winzige Servomotorsteuerung |Hackaday

2022-10-02 13:55:10 By : Ms. judy zhu

Wenn Sie ein bewegliches Ding mit einem Mikrocontroller bauen, möchten Sie wahrscheinlich einen Servocontroller in die Mischung werfen.Das Ansteuern eines oder zweier Servos mit einem Mikrocontroller nimmt wertvolle Zyklen weg, die nur das Servo babysitten und sicherstellen, dass alle PWM-Signale synchron sind.Die Sache ist, dass die meisten Servocontroller ein massiver Overkill sind, und Sie brauchen nicht so viel, um ein paar Servos über einen UART zu steuern.Der Beweis dafür ist ein attiny13-Servocontroller auf hackaday.io.[arief] entwickelte seinen winzigen Servocontroller um einen der kleinsten Mikrocontroller herum – den ATtiny13.Dieser Chip hat nur 1 KB Flash und 64 Bytes RAM, aber das reicht aus, um ein paar Servos am Laufen zu halten und einen UART auf Befehle zum Ansteuern des Servos zu hören.Der Aufbau dieser Servocontrollerplatine ist einfach genug – nur eine einseitige Platine, ein Mikrocontroller und ein paar Header, Kappen und Widerstände.Befehle werden über einen Halbduplex-UART, den wir zuvor behandelt haben, an den ATtiny gesendet, wobei Servos auf einfache serielle Befehle reagieren.Wenn Sie eine Roboterarmee aufbauen, ist dies das richtige Brett.Sie werden einen leistungsstarken Controller brauchen, um die Welt zu erobern, aber es besteht keine Notwendigkeit, diesen Controller durch das Babysitten von ein paar Servos zu verzetteln.In den meisten Projekten sind UART-Ports knapper als CPU-Zyklen.Oder verwenden Sie ein paketbasiertes asynchrones serielles Protokoll, das wie I2C funktioniert – hören Sie auf das Broadcast-Adressbyte und tun Sie nur etwas, wenn es mit der Adresse übereinstimmt.– Ignorieren Sie den Rest des Pakets, wenn die Adresse nicht übereinstimmt. Es gibt ein 9. Bit auf dem UART, das zum Markieren spezieller Seitenbandbefehle/Adressen wie dieser verwendet werden kann.Oder senden Sie einen Burst von Bytes, gefolgt von einer Pause.Das erste Servo hört auf das erste Byte, das zweite Servo hört auf das zweite Byte usw.Was ich an diesen Lösungen nicht mag, ist, dass sie den Aufwand erfordern, alle MCUs zu programmieren und einen Weg zu finden, ihnen ID-Nummern zuzuweisen.Stattdessen würde ich die Servos lieber an ein paar GPIO-Pins anschließen und einen einzelnen Timer-Interrupt mit hoher Priorität verwenden, um sie zu steuern.Für eine begrenzte Anzahl von Servos können Sie einen ausschalten und den nächsten einschalten und einen neuen Timeout-Wert einstellen.Das würde nur ein paar Zyklen dauern.Es scheint kaum einen Artikel über HAD wert zu sein.Wenn ich ein Servo mit Strom versorgen muss, verwende ich einen PIC und Assembler, das sind ungefähr 20 Codezeilen, wenn das so ist, wenn ich mehr als auf und ab sprechen muss, verwende ich I2C-Routinen, die ich irgendwann in den 1980er Jahren geschrieben habeGut zu wissen, dass immer ein besserwisser zur Hand ist.Möchten Sie Ihren Ansatz auf Hackaday.io teilen?Deshalb liebe ich meine Arduino Megas!!!Original und SeedStudio, 4 UARTs FTW!!!!Dies sieht nach einer großartigen Möglichkeit aus, einem Raspberry Pi eine Servosteuerung hinzuzufügen.Es ist eigentlich nicht dieser Halbduplex-UART.Wenn Sie auf die Platine schauen, werden Sie sehen, dass dort keine Transistoren sind.Es ist nur die Hälfte eines UART, mit nur RX-Pin.Überhaupt kein TX.Wenn die andere Seite der Verbindung bereit ist, mitzuspielen (dh wenn ein geeigneter Software-UART-Code ausgeführt wird), können Sie Halbduplex ohne zusätzliche Hardware und einen Pin ausführen.Die Schaltung, auf die Sie sich beziehen (http://hackaday.com/2014/01/13/software-half-duplex-uart-for-avrs/), ist nur wirklich notwendig, um einen 1-poligen UART mit einem 2- Stift, normaler UART.Aber ja, im Moment hat er nur RX am Board, wahrscheinlich weil das alles ist, was er wirklich braucht.Ich benutze einen ULN2803, um meinen Servo- oder PWM-Haushalt zu erledigen, um meinen Arduino für andere Dinge frei zu halten.Wie machen Darlington-Fahrer das??!?Michael – sag mehr.Haben Sie irgendwo dokumentierte Projekte, die Sie teilen könnten?Vielen Dank.Ich habe falsch geschrieben.Ich habe mir ein altes, mikrointelligentes RGBW-LED-Lichtprojekt angesehen, das auf meiner Werkbank verstaubt ist.Ich sollte erwähnen, dass ein TLC5940 den ULN2803 antreibt.Der TLC treibt die PWM-Zyklen an.Die ULN dient der Verstärkung.Das macht mehr Sinn, finde ich.Warum müssen Sie die PWM-Signale verstärken?Ein Servo benötigt keinen hohen Strom für das Steuersignal, und im Fall von LEDs müssen Sie mit 120 mA arbeiten, bevor eine Verstärkung hinzugefügt wird.Einige große RGBW-LEDs ansteuern?Du könntest Recht haben.Ich verwende die ULN für die 1-Watt-LEDs.Nicht die Servos.Mein ursprünglicher Beitrag hätte lauten sollen: „Ich benutze einen TLC5940, um meinen Servo- oder PWM-Haushalt zu erledigen, damit mein Arduino für andere Dinge frei bleibt.“Der ULN2803 treibt in einem meiner Projekte eine 1-Watt-RGBW-LED an.Das ist es, was ich bekomme, wenn ich so früh am Morgen auf das Proto-Board schaue.:-DRS485 / 422 oder I2C löst dies (1 Sender, mehrere Down-Empfänger)Das erfordert zwei Drähte, und er will alle Pins, die er für die Servos haben kann.„Aufgrund der UART-Trefferrate von weniger als 70 % ist es gut für Sie, den Befehl 3-5 Mal zu wiederholen.“ WTF?Sie haben gerade alle Ihre realen oder eingebildeten Ersparnisse verloren.Eine so hohe Bitfehlerrate kann die Verwendung eines Quarzoszillators zum Ansteuern des Mikros erforderlich machen.Steht wahrscheinlich im Datenblatt.I2c wäre besserEin Protokoll, das das Timing darin einbettet, wie Manchester Encoding, ist eine noch bessere Option und kann mit Ihrer 1-Bit-Hardware durchgeführt werden.I2C ist in diesem Fall jedoch so viel einfacher.Tiny13 hat keinen externen Takteingang.Und die PWM erfolgt in Software, wenn 5 Servos angesteuert werden.Und selbst wenn Hardware für alle fünf Ausgänge vorhanden wäre, müssen Sie entweder eine schlechte Auflösung akzeptieren oder die OSCAL-Register optimieren, um die richtige Frequenz aus dem 8-Bit-Timer herauszuholen (ich habe PWM für Servo mit dem Timer auf tiny13 und dem Software-i2c-Master gemacht, aber das war bei einem anderen Projekt).Gute Verwendung eines ressourcenbeschränkten Prozessors.:) Ich mag es, Projekte zu sehen, die etwas so Kleines nehmen und es weit über sein Gewicht bringen.Ich mag es nicht, wenn Leute seine Nützlichkeit in Frage stellen, dass es getan wurde, ist genug für mich.Gut gemacht!:)Ich habe meinen Soft-UART fehlerfrei bei 115.200 auf einem ATtiny13a laufen lassen.Ich finde, dass der interne Oszillator des t13 oft weit von 9,6 MHz entfernt ist, mit einigen so niedrig wie 9,2 und anderen mit 9,8.Verwenden Sie entweder einen Programmierer, der OSCCAL-Tuning durchführt, oder ändern Sie F_CPU für den bestimmten AVR, den Sie programmieren.Um die Frequenz zu messen, führen Sie ein kleines Programm aus, das einen Pin in einem bekannten Intervall umschaltet, und messen Sie dann die Ausgabe mit einem Oszilloskop oder sogar einem Multimeter mit einer Frequenzeinstellung.Ein einfaches 4-Zeilen-ASM-Programm könnte funktionieren: ldi r15, 0x01 out DDRB, r15 ;Ausgabemodus aus PINB, r15 ;Toggle-Pin rjmp -2 ;wiederholenPB0 schaltet alle 3 Zyklen oder 1,6 MHz um, wenn der t13-Oszillator mit 9,6 MHz läuft.Wenn Sie bei PB0 1,55 MHz erhalten, wissen Sie, dass der Oszillator mit 9,3 MHz läuft, und können F_CPU entsprechend anpassen.Ich habe auch den ursprünglichen Soft-UART-Code verbessert, sodass es beim Tx-Timing keinen Jitter gibt (die Originalversion hatte einen Unterschied von 1 Zyklus zwischen einem 1- und einem 0-Bit).https://github.com/nerdralph/nerdralph/tree/master/avr/libs/bbuartWarum nicht die Daten auf der seriellen Leitung als Timing-Referenz verwenden?Bei der Adressierung der Servos mit „A“ … „E“ erfolgt nach dem 6. Datenbit immer ein Low-High-Übergang.Ich habe genau das getan und es funktioniert gut auf der ATtiny-Serie.Zumindest die, an denen ich gearbeitet habe.Ich wünschte, ich könnte mir das anrechnen lassen, aber ich habe mir den Code von TinySafeBoot für diejenigen ausgeliehen, auf denen ich keinen Bootloader haben wollte.IIRC, der Code kann getrimmt werden, um die unerwünschten Protokolle zu entfernen.Eine Sache, die beim Ansteuern externer Lasten beim t13 zu beachten ist, ist, dass nur PB0 und PB1 die volle Antriebsstärke haben.PB2-5 sind weniger, und wie bei allen Attinies ist die Laufwerksstärke auf PB5 (mit deaktiviertem RST) scheiße.Völlig richtig, aber Sie fächern Ihre I/O nicht auf.Mit Ausnahme von RST hatte ich eine sehr zufriedenstellende Leistung an den Pins mit „weniger als voller Stärke“* in einer 1-zu-1-IC-Konfiguration.Das ist alles, was das Servo wirklich braucht, ein Signal.Nicht so, als würden Sie versuchen, den Motor selbst mit den ATtiny-Pins anzutreiben.* Ich habe nie versucht, RST auf einem AVR zu deaktivieren.Ich würde gerne eine i2c-Version sehen.Es würde jedoch eine Stecknadel auffressen und Sie würden nur 4 Kanäle erhalten.obwohl ich mir sicher bin, dass eines meiner Projekte die serielle Version gut nutzen würde.Ich benutze nicht wirklich viele serielle Geräte und benutze die UART-Leitungen immer für andere Dinge.Ich neige dazu zu denken, dass ein Can-Bus eine gute Möglichkeit wäre, viele Servos zu steuern.Würde gerne sehen, dass es mehr in Projekten verwendet wird.Wer ein Servo mit ernsthafter Präzision steuern möchte, sollte sich das ansehen: SuperModified v3.0 Zero One Mechatronics SKU: ENC5V15BS / DRV24V005AV03 / MCU24V328V03 http://www.01mechatronics.com/productsBitte seien Sie freundlich und respektvoll, um dazu beizutragen, dass der Kommentarbereich ausgezeichnet wird.(Kommentarrichtlinie)Diese Seite verwendet Akismet, um Spam zu reduzieren.Erfahren Sie, wie Ihre Kommentardaten verarbeitet werden.Durch die Nutzung unserer Website und Dienste stimmen Sie ausdrücklich der Platzierung unserer Leistungs-, Funktions- und Werbe-Cookies zu.Mehr erfahren